/* To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SubsitemaAgenda;

import clienteSandraParada.Login;
import com.toedter.calendar.JCalendar;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.print.PrinterException;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTable.PrintMode;
import javax.swing.ListCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import service.Cita;

/**
 * Clase con la interfaz principal de agenda, esta contiene un jScrollPane donde
 * se montan los paneles de agenda diaria, semana o mensual
 *
 * @author Mario
 */
public class Agenda extends javax.swing.JPanel {

    public Dia dia;
    public Semana semana;
    JTable agendaDiaria;

    /**
     * Constructor de la clase, inicializa componentes propias de la clase
     * ademas llama al metodo buscarProfesionales para agregarlos al JComboBox
     */
    public Agenda() {
        initComponents();
        normalizarMensajeria();
        AgregarProfesionales();
        verPanelDia(null);
        campoProfesionales.setRenderer(new RenderJCombobox());
        this.dialogoBuscarPacientes.setIconImage(new ImageIcon(getClass().getResource("/GUI/Img/logo2.png")).getImage());
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        dialogoBuscarPacientes = new javax.swing.JDialog();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jPanel5 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        campoProfesionales = new javax.swing.JComboBox();
        botonAgendaSemanal = new javax.swing.JToggleButton();
        botonAgendaDiaria = new javax.swing.JToggleButton();
        contenedorAgenda = new javax.swing.JScrollPane();
        campoBuscar = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        jPanel6 = new javax.swing.JPanel();
        campoMensajeria = new javax.swing.JLabel();
        jPanel7 = new javax.swing.JPanel();
        botonAgregar = new javax.swing.JButton();
        botonImprimir = new javax.swing.JButton();
        botonPagos = new javax.swing.JButton();
        botonCitasNoConfirmadas = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();

        dialogoBuscarPacientes.setMinimumSize(new java.awt.Dimension(802, 220));

        jScrollPane2.setPreferredSize(new java.awt.Dimension(802, 220));

        jTable1.setAutoCreateRowSorter(true);
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Nombre", "Rut"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setPreferredSize(new java.awt.Dimension(802, 220));
        jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                elegirPaciente(evt);
            }
        });
        jScrollPane2.setViewportView(jTable1);

        javax.swing.GroupLayout dialogoBuscarPacientesLayout = new javax.swing.GroupLayout(dialogoBuscarPacientes.getContentPane());
        dialogoBuscarPacientes.getContentPane().setLayout(dialogoBuscarPacientesLayout);
        dialogoBuscarPacientesLayout.setHorizontalGroup(
            dialogoBuscarPacientesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(dialogoBuscarPacientesLayout.createSequentialGroup()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 802, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        dialogoBuscarPacientesLayout.setVerticalGroup(
            dialogoBuscarPacientesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        setPreferredSize(new java.awt.Dimension(953, 603));

        jPanel5.setBackground(new java.awt.Color(255, 255, 255));
        jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1), "Agenda", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Tahoma", 0, 36))); // NOI18N

        jLabel4.setText("Profesional");

        campoProfesionales.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cambiarProfesional(evt);
            }
        });

        botonAgendaSemanal.setText("Semana");
        botonAgendaSemanal.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                verPanelSemana(evt);
            }
        });

        botonAgendaDiaria.setSelected(true);
        botonAgendaDiaria.setText("Día");
        botonAgendaDiaria.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                verPanelDia(evt);
            }
        });

        campoBuscar.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                campoBuscarKeyReleased(evt);
            }
        });

        jLabel5.setText("Buscar ");

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(contenedorAgenda))
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(botonAgendaDiaria)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonAgendaSemanal)
                        .addGap(18, 18, 18)
                        .addComponent(jLabel4)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(campoProfesionales, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 346, Short.MAX_VALUE)
                        .addComponent(jLabel5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(campoBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonAgendaSemanal)
                    .addComponent(botonAgendaDiaria)
                    .addComponent(jLabel4)
                    .addComponent(campoProfesionales, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5))
                .addGap(13, 13, 13)
                .addComponent(contenedorAgenda, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
                .addContainerGap())
        );

        jPanel6.setBackground(new java.awt.Color(255, 255, 255));

        campoMensajeria.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        campoMensajeria.setText("Área Mensajería");

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(campoMensajeria, javax.swing.GroupLayout.DEFAULT_SIZE, 933, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(campoMensajeria, javax.swing.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE)
        );

        jPanel7.setBackground(new java.awt.Color(255, 255, 255));

        botonAgregar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Agregar.png"))); // NOI18N
        botonAgregar.setText("Agregar cita");
        botonAgregar.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        botonAgregar.setMargin(new java.awt.Insets(2, 4, 2, 6));
        botonAgregar.setMaximumSize(new java.awt.Dimension(97, 43));
        botonAgregar.setMinimumSize(new java.awt.Dimension(97, 43));
        botonAgregar.setPreferredSize(new java.awt.Dimension(97, 43));
        botonAgregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                agregarCita(evt);
            }
        });

        botonImprimir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Imprimir.png"))); // NOI18N
        botonImprimir.setText("Agenda diaria");
        botonImprimir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                imprimirAgendaDiaria(evt);
            }
        });

        botonPagos.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Finanzas.png"))); // NOI18N
        botonPagos.setText("Pagar");
        botonPagos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonPagosActionPerformed(evt);
            }
        });

        botonCitasNoConfirmadas.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Find.png"))); // NOI18N
        botonCitasNoConfirmadas.setText("Citas no confirmadas");
        botonCitasNoConfirmadas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCitasNoConfirmadasActionPerformed(evt);
            }
        });

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/refrescar.png"))); // NOI18N
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(botonPagos, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonCitasNoConfirmadas, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonImprimir, javax.swing.GroupLayout.PREFERRED_SIZE, 137, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonAgregar, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {botonAgregar, botonImprimir, botonPagos});

        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonAgregar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonImprimir, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonPagos, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botonCitasNoConfirmadas)
                    .addComponent(jButton1))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
    }// </editor-fold>//GEN-END:initComponents
/*
     * Agrega una cita dependiendo de que sea semana dia o semanal
     */
    private void agregarCita(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_agregarCita
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isAgregarCita()) {
            DialogoAgregarCita dialogo = null;
            //agrega cita dia
            if (botonAgendaDiaria.isSelected() && dia.jTable1.getSelectedColumn()!=0) {
                if (!(dia.jTable1.getValueAt(dia.jTable1.getSelectedRow(), dia.jTable1.getSelectedColumn()) instanceof service.HoraBloqueada)) {
                    dialogo = new DialogoAgregarCita(dia, null, "Dia", dia.horario);
                    dialogo.setVisible(true);
                    normalizarMensajeria();
                } else 
                    JOptionPane.showMessageDialog(this, "Hora bloqueada, no es posible agregar citas");                
            //agregar cita semanal
            }else if (this.botonAgendaSemanal.isSelected() && semana.jTable1.getSelectedColumn()!=0) {
                if (!(dia.jTable1.getValueAt(dia.jTable1.getSelectedRow(), dia.jTable1.getSelectedColumn()) instanceof service.HoraBloqueada)) {
                    dialogo = new DialogoAgregarCita(dia, null, "Dia", dia.horario);
                    dialogo.setVisible(true);
                } else 
                    JOptionPane.showMessageDialog(this, "Hora bloqueada, no es posible agregar citas");                
            }else {
                cambiarEtiquetaMensajeria("Debe seleccionar el bloque donde agregar la cita", Color.red);
            }        
            
            if (dialogo != null && dialogo.isAgregadaExitosamente) {
                cambiarEtiquetaMensajeria("La cita ha sido agregada exitosamente", Color.black);
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para mas información");
            if (!(semana.jTable1.getValueAt(semana.jTable1.getSelectedRow(), semana.jTable1.getSelectedColumn()) instanceof service.HoraBloqueada)) {
                DialogoAgregarCita dialogo = new DialogoAgregarCita(null, semana, "Semana", semana.horario);
                dialogo.setVisible(true);
                normalizarMensajeria();
            } else {
                JOptionPane.showMessageDialog(this, "Hora bloqueada, no es posible agregar citas");
            }
        }

    }//GEN-LAST:event_agregarCita

    private void verPanelDia(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_verPanelDia
        if (this.botonAgendaSemanal.isSelected()) {
            this.botonAgendaSemanal.setSelected(false);
        }
        if (!this.botonAgendaDiaria.isSelected()) {
            this.botonAgendaDiaria.setSelected(true);
        }
        service.Usuario u = (service.Usuario) this.campoProfesionales.getSelectedItem();
        if (u != null) {
            if (dia == null) {
                dia = new Dia(u, this);
            } else {
                dia.isRefresco = false;
                dia.setProfesional(u);
            }
            this.contenedorAgenda.setViewportView(dia);
        }
    }//GEN-LAST:event_verPanelDia

    private void verPanelSemana(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_verPanelSemana
        if (this.botonAgendaDiaria.isSelected()) {
            this.botonAgendaDiaria.setSelected(false);
        }
        if (!this.botonAgendaSemanal.isSelected()) {
            this.botonAgendaSemanal.setSelected(true);
        }
        service.Usuario u = (service.Usuario) this.campoProfesionales.getSelectedItem();
        if (u != null) {
            if (semana == null) {
                semana = new Semana(u, this);
            } else {
                semana.setProfesional(u);
            }
            this.contenedorAgenda.setViewportView(semana);
        }

    }//GEN-LAST:event_verPanelSemana

    private void elegirPaciente(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_elegirPaciente
        if (evt.getClickCount() == 2) {
            String rut = (String) jTable1.getValueAt(jTable1.getSelectedRow(), 1);
            JCalendar fecha = null;
            if (this.botonAgendaDiaria.isSelected()) {
                fecha = dia.jCalendar1;
            }
            if (this.botonAgendaSemanal.isSelected()) {
                fecha = semana.jCalendar1;
            }
            List<service.Cita> l = (List<service.Cita>) buscarCitasDePaciente(rut);
            if (!Login.getUser().getTipoCuenta().equals("Profesional")) {//administrador o secretaria                       
                if (l.size() != 0) {
                    DialogoBuscarCitas d = new DialogoBuscarCitas(l, fecha);
                    this.dialogoBuscarPacientes.setVisible(false);
                    d.setVisible(true);
                } else {
                    JOptionPane.showMessageDialog(null, "El paciente no tiene citas");
                }
            } else {//profesional
                if (isPacienteEnlazadoAProfesional(rut, Login.getUser().getRut())) {
                    List<service.Cita> list = new ArrayList<service.Cita>();
                    for (int i = 0; i < l.size(); i++) {
                        if (l.get(i).getRutProfesional().equals(Login.getUser().getRut())) {
                            list.add(l.get(i));
                        }
                    }
                    DialogoBuscarCitas d = new DialogoBuscarCitas(list, fecha);
                    this.dialogoBuscarPacientes.setVisible(false);
                    d.setVisible(true);

                } else {
                    JOptionPane.showMessageDialog(null, "No tiene citas con el paciente");
                }
            }
        }

    }//GEN-LAST:event_elegirPaciente
    /*
     * Imprime la agenda diaria de un profesional
     */
    private void imprimirAgendaDiaria(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_imprimirAgendaDiaria
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isImprimirAgendaDiaria()) {
            try {
                GregorianCalendar c = new GregorianCalendar();
                c.setTime(dia.jCalendar1.getDate());
                XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
                List<service.Cita> list = buscarCitasDiariaPorProfesional(this.dia.getProfesional().getRut(), calendar);
                if (!list.isEmpty()) {
                    String[] columNames = {"Hora", "Ses", "Paciente", "Edad", "Previsión", "Fono", "Estado", "Obs"};
                    Object[][] data = new Object[list.size() + 1][8];
                    data[0][0] = "HORA";
                    data[0][1] = "SES";
                    data[0][2] = "PACIENTE";
                    data[0][3] = "EDAD";
                    data[0][4] = "PREVISION";
                    data[0][5] = "FONO";
                    data[0][6] = "ESTADO";
                    data[0][7] = "OBS";
                    for (int i = 0; i < list.size(); i++) {
                        service.Paciente paciente = (service.Paciente) cargarPaciente(list.get(i).getRutPaciente());
                        String hora = "", minuto = "";
                        if (list.get(i).getDesdeHora() < 10) {
                            hora = "0" + list.get(i).getDesdeHora();
                        } else {
                            hora = list.get(i).getDesdeHora() + "";
                        }
                        if (list.get(i).getDesdeMinuto() < 10) {
                            minuto = "0" + list.get(i).getDesdeMinuto();
                        } else {
                            minuto = list.get(i).getDesdeMinuto() + "";
                        }
                        data[i + 1][0] = hora + ":" + minuto;
                        data[i + 1][1] = list.get(i).getNumeroSesion();
                        data[i + 1][2] = paciente.getNombres() + " " + paciente.getApellidoPaterno() + " " + paciente.getApellidoMaterno();
                        data[i + 1][3] = calcularEdad(paciente.getFechaNac());
                        data[i + 1][4] = paciente.getPrevision();
                        data[i + 1][5] = paciente.getCelular();
                        data[i + 1][6] = list.get(i).getEstado();
                        data[i + 1][7] = list.get(i).getObservacion();
                    }
                    agendaDiaria = new JTable(data, columNames);
                    agendaDiaria.getColumnModel().getColumn(0).setWidth(40);
                    agendaDiaria.getColumnModel().getColumn(1).setWidth(30);
                    agendaDiaria.getColumnModel().getColumn(3).setWidth(35);
                    agendaDiaria.getColumnModel().getColumn(5).setWidth(60);
                    agendaDiaria.setPreferredScrollableViewportSize(new Dimension(800, 200));
                    agendaDiaria.setSize(new Dimension(800, 200));
                    agendaDiaria.setPreferredSize(new Dimension(800, 200));
                    MessageFormat headerFormat = new MessageFormat(dia.getProfesional().getNombres() + " " + dia.getProfesional().getApellidoPaterno());
                    MessageFormat footerFormat = new MessageFormat("- Página {0} -");
                    try {
                        agendaDiaria.print(PrintMode.FIT_WIDTH, headerFormat, footerFormat);
                        cambiarEtiquetaMensajeria("Agenda diaria impresa exitosamente", Color.black);
                    } catch (PrinterException ex) {
                        Logger.getLogger(Agenda.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    JOptionPane.showMessageDialog(this, "El día no posee citas, no es posible imprimir");
                }
            } catch (DatatypeConfigurationException ex) {
                Logger.getLogger(Agenda.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
        }
    }//GEN-LAST:event_imprimirAgendaDiaria

    private void cambiarProfesional(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cambiarProfesional
        if (this.campoProfesionales.getItemCount() > 0) {
            service.Usuario u = (service.Usuario) this.campoProfesionales.getSelectedItem();
            if (this.botonAgendaDiaria.isSelected()) {
                if (dia == null) {
                    dia = new Dia(u, this);
                    dia.isRefresco = false;
                } else {
                    dia.setProfesional(u);
                    dia.isRefresco = false;
                }
            } else {
                if (semana == null) {
                    semana = new Semana(u, this);
                } else {
                    semana.setProfesional(u);
                }
            }
        }

    }//GEN-LAST:event_cambiarProfesional

    private void botonPagosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonPagosActionPerformed
        this.normalizarMensajeria();
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isPagarCita()) {
            if (this.botonAgendaDiaria.isSelected() && dia.jTable1.getSelectedRowCount() == 1
                    && dia.jTable1.getModel().getValueAt(dia.jTable1.getSelectedRow(), dia.jTable1.getSelectedColumn()) != null
                    && dia.jTable1.getSelectedColumn() != 0) {

                PanelCita panel = (PanelCita) this.dia.jTabbedPane1.getSelectedComponent();
                service.Cita cita = panel.getCita();

                if (cita != null) {
                    if (!cita.getEstado().equalsIgnoreCase("Pagada")) {
                        String idPrograma = cita.getIdPrograma();
                        if (cita.getTipoPrograma().equalsIgnoreCase("FONASA")) {
                            service.ProgramaMedicoFonasa pmf = (service.ProgramaMedicoFonasa) cargarProgramaFonasaPorNumero(idPrograma);
                            if (pmf != null) {
                                if (!pmf.isPagado()) {
                                    DialogoPagarCita dpc = new DialogoPagarCita(null, true, cita, idPrograma, true);
                                    dpc.setLocationRelativeTo(null);
                                    dpc.setVisible(true);
                                } else {
                                    this.cambiarEtiquetaMensajeria("El programa asociado a esta cita ya se encuentra pagado", Color.red);
                                }
                            }
                        } else if (cita.getTipoPrograma().equalsIgnoreCase("DIPRECA")) {
                            service.ProgramaDipreca pd = (service.ProgramaDipreca) obtenerProgramaDipreca(idPrograma);
                            if (pd != null) {
                                if (!pd.isPagado()) {
                                    DialogoPagarCita dpc = new DialogoPagarCita(null, true, cita, idPrograma, true);
                                    dpc.setLocationRelativeTo(null);
                                    dpc.setVisible(true);
                                } else {
                                    this.cambiarEtiquetaMensajeria("El programa asociado a esta cita ya se encuentra pagado", Color.red);
                                }
                            }
                        } else if (cita.getTipoPrograma().equalsIgnoreCase("JEAFOSALE")) {
                            service.ProgramaMedicoJeafosale pj = (service.ProgramaMedicoJeafosale) obtenerProgramaJeafosale(idPrograma);
                            if (pj != null) {
                                if (!pj.isPagado()) {
                                    DialogoPagarCita dpc = new DialogoPagarCita(null, true, cita, idPrograma, true);
                                    dpc.setLocationRelativeTo(null);
                                    dpc.setVisible(true);
                                } else {
                                    this.cambiarEtiquetaMensajeria("El programa asociado a esta cita ya se encuentra pagado", Color.red);
                                }
                            }
                        } else {
                            DialogoPagarCita dpc = new DialogoPagarCita(null, true, cita, idPrograma, false);
                            dpc.setLocationRelativeTo(null);
                            dpc.setVisible(true);
                        }
                    } else {
                        this.cambiarEtiquetaMensajeria("La cita seleccionada ya se encuentra pagada", Color.red);
                    }
                }
            } else {
                this.campoMensajeria.setText("Debe seleccionar una cita");
                this.campoMensajeria.setForeground(Color.red);
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
        }
    }//GEN-LAST:event_botonPagosActionPerformed

    private void campoBuscarKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoBuscarKeyReleased
        int key = evt.getKeyCode();
        if (key == KeyEvent.VK_ENTER) {
            buscarCitas();
        }
    }//GEN-LAST:event_campoBuscarKeyReleased

    private void botonCitasNoConfirmadasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCitasNoConfirmadasActionPerformed
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isListarcitasNoConfirmadas()) {


            List<Cita> list = null;
            if (Login.getUser().getTipoCuenta().equals("Administrador") || Login.getUser().getTipoCuenta().equals("Secretaria")) {
                list = citasPorConfirmar();
            } else {
                list = citasPorConfirmarSegunProfesional(Login.getUser().getRut());
            }
            if (!list.isEmpty()) {
                if (botonAgendaDiaria.isSelected()) {
                    DialogoCitasNoConfirmadas dialogoCitasNoConfirmadas = new DialogoCitasNoConfirmadas(null, true, list, dia, null);
                    dialogoCitasNoConfirmadas.setLocationRelativeTo(null);
                    dialogoCitasNoConfirmadas.setVisible(true);
                }
                if (botonAgendaSemanal.isSelected()) {
                    DialogoCitasNoConfirmadas dialogoCitasNoConfirmadas = new DialogoCitasNoConfirmadas(null, true, list, null, semana);
                    dialogoCitasNoConfirmadas.setLocationRelativeTo(null);
                    dialogoCitasNoConfirmadas.setVisible(true);
                }
            } else {
                JOptionPane.showMessageDialog(this, "No existen citas no confirmadas");
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
        }
    }//GEN-LAST:event_botonCitasNoConfirmadasActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        if (botonAgendaDiaria.isSelected()) {
            dia.refrescoAgenda();
        } else {
            semana.refrescoAgenda();
        }
    }//GEN-LAST:event_jButton1ActionPerformed
    public List<Cita> buscarCitasDePaciente(String rut) {
        List<service.Cita> list = buscarCitasPorPaciente(rut);
        return list;

    }
    /*
     * Metodo que a traves de un llamado al servicio buscarProfesionales obtiene todos estos de la BD y los agrega a
     * el combobox de la agenda
     */

    public void AgregarProfesionales() {
        List<service.Usuario> list = buscarProfesionales();
        this.campoProfesionales.removeAllItems();

        if (!list.isEmpty()) {
            service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
            if (!p.isVerAgendaDeTodosLosProfesionales()) {
                campoProfesionales.addItem(Login.getUser());
                campoProfesionales.setEnabled(false);
            } else {
                for (int j = 0; list.size() > j; j++) {
                    this.campoProfesionales.addItem(list.get(j));
                }
            }
        } else {
            cambiarEtiquetaMensajeria("No existen profesionales", Color.red);
        }
    }

    public String[] obtenerCambios(Cita citaModificada, Cita citaOriginal) {
        ArrayList<String> valoresAnteriores = new ArrayList<String>();
        ArrayList<String> valoresNuevos = new ArrayList<String>();
        if (citaModificada.getDesdeHora() != citaOriginal.getDesdeHora()) {
            valoresNuevos.add("Desde hora: " + citaModificada.getDesdeHora() + "");
            valoresAnteriores.add("Desde hora: " + citaOriginal.getDesdeHora() + "");
        }
        if (citaModificada.getDesdeMinuto() != citaOriginal.getDesdeMinuto()) {
            valoresNuevos.add("Desde minutos: " + citaModificada.getDesdeMinuto() + "");
            valoresAnteriores.add("Desde minutos: " + citaOriginal.getDesdeMinuto() + "");
        }
        if (!citaModificada.getEstado().equals(citaOriginal.getEstado())) {
            valoresNuevos.add("Estado: " + citaModificada.getEstado());
            valoresAnteriores.add("Estado: " + citaOriginal.getEstado());
        }
        if (citaModificada.getNumeroSesion() != citaOriginal.getNumeroSesion()) {
            valoresNuevos.add("Número sesión: " + citaModificada.getNumeroSesion() + "");
            valoresAnteriores.add("Número sesión: " + citaOriginal.getNumeroSesion() + "");
        }
        if (!citaModificada.getObservacion().equals(citaOriginal.getObservacion())) {
            valoresNuevos.add("Observación: " + citaModificada.getObservacion());
            valoresAnteriores.add("Observación: " + citaOriginal.getObservacion());
        }
        String anteriores = "", nuevos = "";

        for (int i = 0; i < valoresAnteriores.size(); i++) {
            if (valoresAnteriores.size() - 1 == i) {
                anteriores = anteriores + valoresAnteriores.get(i);
            } else {
                anteriores = anteriores + valoresAnteriores.get(i) + "\n";
            }
        }
        for (int i = 0; i < valoresNuevos.size(); i++) {
            if (valoresNuevos.size() - 1 == i) {
                nuevos = nuevos + valoresNuevos.get(i);
            } else {
                nuevos = nuevos + valoresNuevos.get(i) + "\n";
            }
        }
        String[] s = new String[2];
        s[0] = anteriores;
        s[1] = nuevos;
        return s;
    }

    public void actualizarTabla() {
        AgregarProfesionales();
    }

    public void normalizarMensajeria() {
        campoMensajeria.setText("Área de mensajería");
        campoMensajeria.setForeground(Color.black);
    }

    public void cambiarEtiquetaMensajeria(String mensaje, Color color) {
        campoMensajeria.setText(mensaje);
        campoMensajeria.setForeground(color);
    }

    public int calcularEdad(String fecha) {
        String datetext = fecha;
        try {
            Calendar birth = new GregorianCalendar();
            Calendar today = new GregorianCalendar();
            int age = 0;
            int factor = 0;
            Date birthDate = new SimpleDateFormat("dd-MM-yyyy").parse(datetext);
            Date currentDate = new Date(); //current date
            birth.setTime(birthDate);
            today.setTime(currentDate);
            if (today.get(Calendar.MONTH) <= birth.get(Calendar.MONTH)) {
                if (today.get(Calendar.MONTH) == birth.get(Calendar.MONTH)) {
                    if (today.get(Calendar.DATE) > birth.get(Calendar.DATE)) {
                        factor = -1; //Aun no celebra su cumpleaÃ±os
                    }
                } else {
                    factor = -1; //Aun no celebra su cumpleaÃ±os
                }
            }
            age = (today.get(Calendar.YEAR) - birth.get(Calendar.YEAR)) + factor;
            if (age != -1) {
                return age;
            } else {
                return 0;
            }
        } catch (ParseException e) {
            return -1;
        }
    }

    public void buscarCitas() {
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isBuscarCitas()) {
            if (!this.campoBuscar.getText().equals("")) {
                List<service.Paciente> list = filtrarPaciente(campoBuscar.getText());
                if (!list.isEmpty()) {
                    String[] columNames = {"Nombre", "Rut", "Provincia", "Comuna", "Sector", "Calle", "Número", "Departamento", "Bloque", "Telefono", "Celular"};
                    Object[][] data = new Object[list.size()][11];
                    for (int i = 0; i < list.size(); i++) {
                        data[i][0] = list.get(i).getNombres() + " " + list.get(i).getApellidoPaterno() + " " + list.get(i).getApellidoMaterno();
                        data[i][1] = list.get(i).getRut();
                        data[i][2] = list.get(i).getProvincia();
                        data[i][3] = list.get(i).getComuna();
                        data[i][4] = list.get(i).getSector();
                        data[i][5] = list.get(i).getCalle();
                        data[i][6] = list.get(i).getNumero();
                        data[i][7] = list.get(i).getDepartamento();
                        data[i][8] = list.get(i).getBloque();
                        data[i][9] = list.get(i).getTelefono();
                        data[i][10] = list.get(i).getCelular();
                    }
                    this.jTable1.setModel(new DefaultTableModel(data, columNames) {
                        public boolean isCellEditable(int row, int column) {
                            return false;
                        }
                    });
                    this.dialogoBuscarPacientes.setTitle("Pacientes");
                    this.dialogoBuscarPacientes.setLocationRelativeTo(null);
                    this.dialogoBuscarPacientes.setVisible(true);

                } else if (list.size() == 1) {
                    JCalendar fecha = null;
                    //dia
                    if (this.botonAgendaDiaria.isSelected()) {
                        fecha = dia.jCalendar1;
                    }
                    //semana
                    if (this.botonAgendaSemanal.isSelected()) {
                        fecha = semana.jCalendar1;
                    }
                    List<Cita> l = buscarCitasDePaciente(list.get(0).getRut());
                    if (l.size() != 0) {
                        DialogoBuscarCitas d = new DialogoBuscarCitas(l, fecha);
                        d.setLocationRelativeTo(null);
                        d.setVisible(true);
                    } else {
                        JOptionPane.showMessageDialog(null, "El paciente no tiene citas");
                    }
                }
            } else {
                JOptionPane.showMessageDialog(null, "Debe ingresar texto");
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para mas información");
        }

    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    public javax.swing.JToggleButton botonAgendaDiaria;
    public javax.swing.JToggleButton botonAgendaSemanal;
    private javax.swing.JButton botonAgregar;
    private javax.swing.JButton botonCitasNoConfirmadas;
    private javax.swing.JButton botonImprimir;
    private javax.swing.JButton botonPagos;
    private javax.swing.JTextField campoBuscar;
    public javax.swing.JLabel campoMensajeria;
    private javax.swing.JComboBox campoProfesionales;
    private javax.swing.JScrollPane contenedorAgenda;
    private javax.swing.JDialog dialogoBuscarPacientes;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTable jTable1;
    // End of variables declaration//GEN-END:variables

    private static boolean modificaCita(service.Cita arg0) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.modificarCita(arg0);
    }

    private static Object buscarCitaPorId(java.lang.Long id) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.buscarCitaPorId(id);
    }

    private static Long registrar(service.Usuario usuario, java.lang.String modulo, java.lang.String accion, java.lang.String valorAnterior, java.lang.String valorNuevo) {
        service.BitacoraWSService service = new service.BitacoraWSService();
        service.BitacoraWS port = service.getBitacoraWSPort();
        return port.registrar(usuario, modulo, accion, valorAnterior, valorNuevo);
    }

    private static Object cargarPrivilegios(java.lang.String rut) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.cargarPrivilegios(rut);
    }

    private static java.util.List<service.Cita> buscarCitasPorPaciente(java.lang.String rut) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.buscarCitasPorPaciente(rut);
    }

    private static java.util.List<service.Usuario> buscarProfesionales() {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.buscarProfesionales();
    }

    private static Object buscarProfesional(java.lang.String rut) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.buscarProfesional(rut);
    }

    private static Object cargarPaciente(java.lang.String rut) {
        service.PacienteWS_Service service = new service.PacienteWS_Service();
        service.PacienteWS port = service.getPacienteWSPort();
        return port.cargarPaciente(rut);
    }

    private static boolean isPacienteEnlazadoAProfesional(java.lang.String rutPaciente, java.lang.String rutProfesional) {
        service.EnlaceProfesionalPacienteWSService service = new service.EnlaceProfesionalPacienteWSService();
        service.EnlaceProfesionalPacienteWS port = service.getEnlaceProfesionalPacienteWSPort();
        return port.isPacienteEnlazadoAProfesional(rutPaciente, rutProfesional);
    }

    private static java.util.List<service.Cita> citasPorConfirmar() {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.citasPorConfirmar();
    }

    private static java.util.List<service.Cita> citasPorConfirmarSegunProfesional(java.lang.String rut) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.citasPorConfirmarSegunProfesional(rut);
    }

    class RenderJCombobox implements ListCellRenderer {

        DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

        @Override
        public Component getListCellRendererComponent(JList jlist, Object e, int i, boolean bln, boolean bln1) {
            JLabel label = (JLabel) defaultRenderer.getListCellRendererComponent(jlist, e, i, bln, bln1);
            if (e instanceof service.Usuario) {
                label.setText(((service.Usuario) e).getNombres() + " " + ((service.Usuario) e).getApellidoPaterno() + " " + ((service.Usuario) e).getApellidoMaterno());
                label.setIcon(new ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Profesional.png")));
            }
            /*if(bln || bln1){                
             text.setBackground(new Color(153, 204, 255));
             }else{
             label.setBorder(null);
             }*/

            return label;
        }
    }

    private static java.util.List<service.Paciente> filtrarPaciente(java.lang.String buscar) {
        service.PacienteWS_Service service = new service.PacienteWS_Service();
        service.PacienteWS port = service.getPacienteWSPort();
        return port.filtrarPaciente(buscar);
    }

    private static java.util.List<service.Cita> buscarCitasDiariaPorProfesional(java.lang.String rutProfesional, javax.xml.datatype.XMLGregorianCalendar fecha) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.buscarCitasDiariaPorProfesional(rutProfesional, fecha);
    }



    private static Object obtenerProgramaDipreca(java.lang.String numero) {
        service.ProgramaDiprecaWSService service = new service.ProgramaDiprecaWSService();
        service.ProgramaDiprecaWS port = service.getProgramaDiprecaWSPort();
        return port.obtenerProgramaDipreca(numero);
    }

    private static Object obtenerProgramaJeafosale(java.lang.String numero) {
        service.ProgramaJeafosaleWSService service = new service.ProgramaJeafosaleWSService();
        service.ProgramaJeafosaleWS port = service.getProgramaJeafosaleWSPort();
        return port.obtenerProgramaJeafosale(numero);
    }

    private static Object cargarProgramaFonasaPorNumero(java.lang.String id) {
        service.ProgramaFonasaWSService service = new service.ProgramaFonasaWSService();
        service.ProgramaFonasaWS port = service.getProgramaFonasaWSPort();
        return port.cargarProgramaFonasaPorNumero(id);
    }   
}
